Załadujmy potrzebne pakiety
library('httr') library('jsonlite') library('reshape2') library('dplyr')
Posłużymy się funkcją GET()
. Interesujące nas parametry, które przyjmuje, to:
GET( url, query = list('nazwaParam1' = wartośćParam1, 'nazwaParam2' = wartośćParam2), username = login, password = hasło )
Funkcja ta zwraca obiekt żądania HTTP. Zwrócone dane, można pobrać funkcją content(obiektŻądania, 'text')
.
Wyszukajmy zatem wszystkie paczki danych obejmujących swoim zasięgiem Puławy pomiędzy 27 a 30 czerwca 2016 r.
W tym celu skorzystamy endpoint-u http://s2.boku.eodc.eu/granule oraz parametrów utm
(pozwala wskazać element siatki UTM, który mają pokrywać dane) oraz parametrów dateMin
(umożliwia wskazanie najstarszej dopuszczalnej daty) i dateMax
:
req = GET( 'http://s2.boku.eodc.eu/granule', query = list('utm' = '34UEB', 'dateMin' = '2016-06-27', 'dateMax' = '2016-06-30'), username = 'WIC', password = 'pulawy2016' ) content(req, 'text')
Umiemy już wysłać żądanie HTTP i odebrać z niego dane. Teraz potrzebujemy je sparsować do struktur danych używanych w R.
Pakiet jsonlite udostępnia funkcję fromJSON()
, która parsuje JSON do struktur danych języka R.
W większości wypadków wynikiem parsowania będzie ramka danych języka R.
Spróbujmy zatem sparsować dane, które pobraliśmy:
paczkiPulawy = fromJSON(content(req, 'text')) paczkiPulawy
Jak widać w wyniku otrzymaliśmy ramkę danych R (możemy o niej myśleć, jak o tabeli), której:
granuleID
), date
), processDate
), utm
), cloudCov
), atmCorr
),geometry
),jobsCount
),url
).Teraz wystarczy się dowiedzieć, w jaki sposób możemy przetwarzać dane znajdujące się w ramkach danych R.
W analogiczny sposób możemy wyszukać same zdjęcia satelitarne: (wyszukamy je już dla jednej, wybranej daty - 2016-06-29 i ograniczymy się do skorygowanych atmosferycznie zdjęć w rozdzielczości 60 m na piksel)
req = GET( 'http://s2.boku.eodc.eu/image', query = list('utm' = '34UEB', 'dateMin' = '2016-06-29', 'dateMax' = '2016-06-29', 'resolution' = 60, 'atmCorr' = 1), username = 'WIC', password = 'pulawy2016' ) zdjecia = fromJSON(content(req, 'text')) # pomińmy wyświetlanie zbędnych kolumn zdjecia %>% select(-granule, -product, -geometry)
Jak widać adres URL umożliwiający pobranie poszczególnych zdjęć znajduje się w kolumnie url
.
Pliki najprościej będzie nam pobrać funkcją download.file(url, ścieżkaZapisu, ...opcje...)
, którą uruchomimy w pętli:
# utworzmy katalog, w którym zapiszemy pliki dir.create('dane', FALSE) # dla i od 1 do liczby wierszy w ramce danych zdjecia... for (i in 1:nrow(zdjecia)) { download.file( paste0(zdjecia[i, 'url'], '?dataType=Int16'), paste0('dane/', zdjecia[i, 'band'], '.tiff'), mode = 'wb', quiet = TRUE ) }
dane
pod nazwami odpowiadającymi kodom pasm promieniowania, ktore przedstawiają.dataType=Int16
dodanego do adresu URL skonwertowaliśmy dane na format TIFF (aby uniknąć potem problemów z wczytywaniem i obróką zdjęć).Przy okazji dowiedzieliśmy się, że:
ramkaDanych[wiersz, kolumna]
paste0()
(w R nie istnieje operator złączania ze sobą łańcuchów znaków)Jednym z parametrów, za pomocą których można filtrować wyszukiwane paczki danych/zdjęcia/itp. (zależnie od endpoint-u) jest geometry
. Pozwala on wyszukiwać obiekty, których obszar przecina wskazany kształt zapisany w formacie geoJSON.
Wiedząc, że aby zapisać punkt o danych współrzędnych geograficznych {X, Y}
w geoJSON, należy użyć szablonu {"type":"Point","coordinates":[X, Y]}
:
B02
, B03
i B04
pokrywające to miejsce.Podpowiedź - sprawdź dokumentację endpoint-u.
Wiedząc, że:
r
, g
oraz b
, które powinny być identyfikatorami zdjęć (imageId
) i składa z nich jeden obraz kolorowy;dcast(ramkaDanych, date ~ band, value.var = 'imageId')
Napisz kod, który wygeneruje adresy URL pobierające kolorowy obraz będący dla danej daty złożeniem pasma B02
(jako b
), B03
(jako g
) i B04
(jako r
).
Pobierz jeden z takich obrazów.
Uwaga - pamiętaj o dodaniu do adresu URL loginu i hasła.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.